package br.unisul.avancado.core.dao;

import java.util.List;

import javax.persistence.EntityManager;

import br.unisul.avancado.core.dao.conexao.EntityManagerProvider;

public class CrudDAO<E> {

	private static EntityManager em;

	public void insert(E entidade){

		em = EntityManagerProvider.getEntityManagerFactory()
		.createEntityManager();

		try{
			em.getTransaction().begin();
			em.persist(entidade);
			em.getTransaction().commit();
		}finally{
			em.close();
		}
	}

	public void update(E entidade){

		em = EntityManagerProvider.getEntityManagerFactory()
		.createEntityManager();

		try{
			em.getTransaction().begin();
			em.merge(entidade);
			em.getTransaction().commit();
		}finally{
			em.close();
		}
	}

	public void delete(E entidade){
		em = EntityManagerProvider.getEntityManagerFactory()
		.createEntityManager();

		try{
			em.getTransaction().begin();
			em.remove(entidade);
			em.getTransaction().commit();
		}finally{
			em.close();
		}
	}

	public E recuperarPorId(Class<? extends E> clazz, Object id){

		em = EntityManagerProvider.getEntityManagerFactory()
		.createEntityManager();

		try{
			em.getTransaction().begin();
			return em.find(clazz, id);
		}finally{
			em.close();
		}
	}


	@SuppressWarnings("unchecked")
	public List<E> listarTodos(Class clazz){

		em = EntityManagerProvider.getEntityManagerFactory()
		.createEntityManager();

		try{
			em.getTransaction().begin();
			return em.createQuery("from " + clazz.getSimpleName())
			.getResultList();
		}finally{
			em.close();
		}
	}
}










